package com.zsrt.oa.product.service.impl;

import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.zsrt.oa.product.dao.ProductDao;
import com.zsrt.oa.product.entity.ProductEntity;
import com.zsrt.oa.product.service.ProductService;
import com.zsrt.utils.DBUtils;

/**
 * 产品服务层的实现类
 * @author 罗智壕-13424431416
 *
 * 2017年6月19日
 */
public class ProductServiceImpl implements ProductService {
	
	static{
		String resource = "mybatisConfig.xml";
		//1 加载 mybatis 的配置文件（它也加载关联的映射文件）
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//2 构建 sqlSession 的工厂
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		//3 创建能执行映射文件中 sql 的 sqlSession
		SqlSession session = sessionFactory.openSession(true);
		dao = session.getMapper(ProductDao.class);
	}
	/**
	 * 初始化产品的持久层
	 */
	private static ProductDao dao;
	
	/**
	 * 查找所有的产品
	 * @param map
	 */
	@Override
	public void findAll(Map<String, Object> map) {
		try {
			List<ProductEntity> list = dao.findAll();
			map.put("result", "success");
			map.put("message", "查询成功...");
			map.put("data", list);
		} catch (SQLException e) {
			map.put("result", "error");
			map.put("message", "服务器出现异常，程序员正在拼命抢修...");
			e.printStackTrace();
		}
	}
	
	/**
	 * 增加产品
	 * @param entity	需要新增的产品
	 * @param map
	 */
	@Override
	public void add(ProductEntity entity, Map<String, Object> map) {
		boolean addResult = checkAdd(entity, map);
		if(addResult){
			try {
				int result = dao.add(entity);
				if(result == 1){
					map.put("result", "success");
					map.put("message", "增加成功...");
				}else{
					map.put("result", "failure");
					map.put("message", "增加失败...");
				}
			} catch (SQLException e) {
				map.put("result", "error");
				map.put("message", "服务器出现异常，程序员正在拼命抢修...");
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 产品增加校验
	 * @param entity
	 * @param map
	 * @return
	 */
	public boolean checkAdd(ProductEntity entity, Map<String, Object> map){
		
		//重量校验
		Integer weight = entity.getProductWeight();
		if(null == weight || "".equals(weight)){
			map.put("result", "failure");
			map.put("message", "重量不能为空...");
			return false;
		}else{
			boolean result = DBUtils.checkWeight(String.valueOf(weight));
			if(!result){
				map.put("result", "failure");
				map.put("message", "重量必须是数字，至少是1位数字..");
				return false;
			}
		}
		
		//价格校验
		Double price = entity.getProductPrice();
		if(null == price || "".equals(price)){
			map.put("result", "failure");
			map.put("message", "价格不能为空...");
			return false;
		}else{
			boolean priceResult = DBUtils.checkPrice(String.valueOf(price));
			if(!priceResult){
				map.put("result", "failure");
				map.put("message", "价格必须是数字或保留2为小数点");
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 批量删除产品
	 * @param proIds	需要删除产品的集合
	 * @param map
	 */
	@Override
	public void batchDeleteIds(String proIds, Map<String, Object> map) {
		if(proIds == null || "".equals(proIds)){
			map.put("result", "failure");
			map.put("message", "删除不能是空...");
			return;
		}
		
		String[] split = proIds.split(",");
		boolean checkResult = true;
		for(int index=0; index<split.length; index++){
			checkResult = DBUtils.checkNumber(split[index]);
		}
		
		if(checkResult){
			try {
				int result = dao.batchDeleteIds(split);
				if(result >= 1){
					map.put("result", "success");
					map.put("message", "删除成功..");
				}
			} catch (SQLException e) {
				map.put("result", "error");
				map.put("message", "服务器出现异常，程序员正在拼命抢修...");
				e.printStackTrace();
			}
		}else{
			map.put("result", "failure");
			map.put("message", "删除必须是数字..");
		}
	}
	
	/**
	 * 指定查询
	 * @param entity	需要查询的产品
	 * @param map
	 */
	@Override
	public void findById(String id, Map<String, Object> map) {
		if(id == null || "".equals(id)){
			map.put("result", "failure");
			map.put("message", "查询不能是空...");
			return;
		}
		try {
			 ProductEntity entity = dao.findById(Integer.parseInt(id));
			 map.put("result", "success");
			 map.put("message", "查询成功..");
			 map.put("data", entity);
		} catch (SQLException e) {
			map.put("result", "error");
			map.put("message", "服务器出现异常，程序员正在拼命抢修...");
			e.printStackTrace();
		}
	}
	
	/**
	 * 修改产品
	 * @param entity	修改后的产品
	 * @param map
	 */
	@Override
	public void updateProductMessage(ProductEntity entity, Map<String, Object> map) {
		if(entity.getId() == null || "".equals(entity.getId())){
			map.put("result", "failure");
			map.put("message", "需要修改的id不能是空...");
			return;
		}
		boolean addResult = checkAdd(entity, map);
		if(addResult){
			try {
				int result = dao.updateProductMessage(entity);
				if(result == 1){
					map.put("result", "success");
					map.put("message", "修改成功...");
				}else{
					map.put("result", "failure");
					map.put("message", "修改失败...");
				}
			} catch (SQLException e) {
				map.put("result", "error");
				map.put("message", "服务器出现异常，程序员正在拼命抢修...");
				e.printStackTrace();
			}
		}
	}
}
